package jfloat;

public class Express {


    public static void main(String[] args) {
        //编译时，java 编译器用的 double
        System.out.println(2.1 * 100);//210.0
        float f = 2.1f;
        //以0.75为例，可以分解为0.5+0.25，转换为二进制即为0.11，但更多的小数会使得二进制表示无限循环，因为存储位数有限，从而只能逼近小数，造成精度误差。
        //10000000 00001100110011001100110
        //整数：10.00001100110011001100110 左移一位 1+127=128
        //128 = 10000000
        Accurate.jdkFloatString(f);
        float f2 = 2.0f;
        //1000000000000000000000000000000
        //sign=0, exponent = 10000000 , mantissa = 00000000000000000000000
        Accurate.jdkFloatString(f2);
        //减法精度缺失
        //阶码相同相减后是0, 位数位相减后：00001100110011001100110, 因为相减后第一个有效位不是1所以要位移
        //右移5位后 00001.10011001100110011000000 ,  阶码=128-5=123=01111011  尾数=10011001100110011000000 (左加右减)
        //换算10进制：
        System.out.println(f - f2);
        Accurate.jdkFloatString(f - f2);
        //将小数位转回十进制精度有缺失
        bitToString("00001100110011001100110");
        //乘法同样出现精度缺失
        //System.out.println(f * 100);//209.99998
    }

    /**
     * 浮点型小数位转十进制
     */
    private static void bitToString(String s) {
        double sum = 0;
        char[] chars = s.toCharArray();
        for (int i=0;i<chars.length;i++) {
            if (chars[i] == '1') {
                sum +=  1d/(1<<i);
            }
        }
        System.out.println(sum);
    }


}
